#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
IR 上下文定义
包含 IR 处理上下文类
"""

from dataclasses import dataclass, field
from typing import List, Dict, Any, Optional, TYPE_CHECKING
from .base import IRNode, ProcessStatus, get_default_ir_node
from .module import IRModule

if TYPE_CHECKING:
    from ..compiler import MCPyCompiler


@dataclass
class IRContext:
    """IR处理上下文类

    为扩展处理器提供便利的方法来访问和查询上下文信息。
    包含IR处理过程中的核心对象和状态信息。
    """

    module: IRModule
    node: IRNode = field(default_factory=get_default_ir_node)
    status: ProcessStatus = ProcessStatus.CONTINUE
    extra_data: Dict[str, Any] = field(default_factory=dict)
    stage: str = field(default="post_analysis")
    timing: str = field(default="post")
    compiler: Optional["MCPyCompiler"] = field(default=None)

    def get_node_type(self) -> str:
        """获取节点类型

        Returns:
            节点类型名称
        """
        return self.node.node_type

    def has_decorator(self, decorator_name: str) -> bool:
        """检查是否有指定的装饰器

        Args:
            decorator_name: 装饰器名称

        Returns:
            如果有该装饰器则返回True，否则返回False
        """
        return self.get_decorator(decorator_name) is not None

    def get_decorators(self) -> List[Dict[str, Any]]:
        """获取所有装饰器

        Returns:
            装饰器列表
        """
        return self.node.decorators

    def get_decorator(self, decorator_name: str) -> Optional[Dict[str, Any]]:
        """获取指定名称的装饰器

        Args:
            decorator_name: 装饰器名称

        Returns:
            装饰器信息，如果不存在则返回None
        """
        for dec in self.get_decorators():
            if dec.get("name") == decorator_name:
                return dec
        return None

    def get_decorator_names(self) -> List[str]:
        """获取所有装饰器名称

        Returns:
            装饰器名称列表
        """
        decorators = self.get_decorators()
        return [dec.get("name", "") for dec in decorators if dec.get("name")]

    def has_function_call(self, function_name: str) -> bool:
        """检查是否有指定的函数调用

        Args:
            function_name: 函数名称

        Returns:
            如果有该函数调用则返回True，否则返回False
        """
        return function_name in self.get_function_calls()

    def get_function_calls(self) -> List[str]:
        """获取所有函数调用

        Returns:
            函数调用列表
        """
        # 从扩展参数中获取函数调用列表
        return self.node.get_extension_param("function_calls", [])

    def get(self, key: str, default: Any = None) -> Any:
        """获取上下文中的值

        Args:
            key: 键名
            default: 默认值

        Returns:
            对应的值或默认值
        """
        # 特殊处理注解相关的属性
        if key == "annotation_name":
            from .declarations.annotation import IRAnnotation

            if isinstance(self.node, IRAnnotation):
                return self.node.annotation_name
            return default

        # 从 extra_data 中获取
        return self.extra_data.get(key, default)

    def set(self, key: str, value: Any) -> None:
        """设置上下文中的值

        Args:
            key: 键名
            value: 值
        """
        self.extra_data[key] = value

    def stop(self):
        self.status = ProcessStatus.BREAK
